const listeners = [];

/**
 * 向目标窗口发送消息。
 * @param {Window} targetWindow - 要发送消息的目标窗口对象 (例如: window.parent, iframe.contentWindow, window.open(...) 返回的窗口对象).
 * @param {any} message - 要发送的消息内容 (可以是任何可以被结构化克隆的对象).
 * @param {string} targetOrigin - 指定目标窗口的源 (协议 + 域名 + 端口). 使用 '*' 表示不限制目标源, 但出于安全考虑不推荐在生产环境中使用.
 */
function sendMessage(targetWindow, message, targetOrigin = '*') {
  if (!targetWindow) {
    // console.error('crossWindowMessenger: targetWindow is null or undefined.');
    return;
  }
  targetWindow.postMessage(message, targetOrigin);
}

/**
 * 注册接收消息的回调函数。当接收到消息时，所有注册的回调函数都会被执行。
 * 回调函数会接收到一个事件对象，该对象包含以下属性:
 * - data: 发送方传递的消息内容.
 * - origin: 发送消息的窗口的源.
 * - source: 发送消息的窗口对象.
 * @param {function(event: MessageEvent)} callback - 接收到消息时执行的回调函数。
 */
function receiveMessage(callback) {
  if (typeof callback !== 'function') {
    console.error('crossWindowMessenger: callback must be a function.');
    return;
  }
  listeners.push(callback);
}

// 监听 message 事件
window.addEventListener('message', function (event) {
  listeners.forEach(listener => listener(event));
});

export default {
  init(targetWindow, targetOrigin = '*') {
    this.targetWindow = targetWindow;
    this.targetOrigin = targetOrigin;
  },
  send(message) {
    this.sendMessage(this.targetWindow, message, this.targetOrigin);
  },
  sendMessage: sendMessage,
  receiveMessage: receiveMessage,
};
